package com.ly.web;
import com.ly.result.R;
import com.ly.tools.CourseRecommendationTools;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.ollama.OllamaChatModel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;

@RestController
@RequestMapping("/ai/chat")
public class AiOllamaController {

    @Autowired
    private OllamaChatModel ollamaChatModel;

    @Autowired
    private ChatMemory chatMemory;

    @Autowired
    private CourseRecommendationTools courseRecommendationTools;

    // 同步响应
    @PostMapping("/sync")
    public R chatSync(@RequestParam String message, @RequestParam String id) {
        try {
            // 流式输出
            //Flux<String> stream = ollamaChatModel.stream("你是谁/no_think");
            //return R.success(stream);

            // 同步输出
            //return R.success(ollamaChatModel.call(message));

            ChatClient chatClient = ChatClient.builder(ollamaChatModel)
                    .defaultSystem("""
                            你是一个专业的教务选课分析助手。请严格根据【真实选课统计数据】来回答问题。
                            你的任务是基于这些真实数据进行分析和总结，用专业、友好的语气回复用户。
                            
                            重要规则：
                            1. 必须基于提供的数据回答，不能编造不存在的信息
                            2. 分析选择模式并给出合理的解释
                            3. 回复要简洁明了，突出重点
                            4. 用户输入的某些课程名可能不完整，你需要查询全部课程表、查询用户信息进行推测补充完整的真实的课程名称
                            
                            【真实选课统计数据】即调用 courseRecommendationTools Tools的返回值
                            """)
                    .defaultTools(courseRecommendationTools)
                    .defaultAdvisors(
                            new SimpleLoggerAdvisor(),   // 简单日志记录
                            PromptChatMemoryAdvisor.builder(chatMemory).build() //对话拦截对话记忆
                    )
                    .build();

            String content = chatClient.prompt()
                    .user(message)
                    .advisors(advisorSpec -> advisorSpec.param(ChatMemory.CONVERSATION_ID, id)) // 做用户隔离
                    .call()
                    .content();

            return R.success(content);

        } catch (Exception e) {
            return R.error("AI服务暂时不可用: " + e.getMessage());
        }
    }

}
